package com.qf.juc;

import java.util.concurrent.*;

/**
 * 线程有多少种写法
 *    写多线程
 *
 * @author lixu
 */
public class ThreadDemo {

    public static void main(String[] args) throws Exception{
        //1:直接写线程
        //new Thread(new MyRunnable(),"gp14").start();
        //2: 自定义一个线程对象
        //new MyThread("AA").start();
        /////////////////////////第三种要以上面二种功能：有返回值的功能 ////////////////////////////////
        //3: Callable接口
        //中间类
        //FutureTask futureTask = new FutureTask(new MyCallable());
        //new Thread(futureTask).start();
        //上面的线程执行完成之后 的返回值

        //System.out.println(futureTask.get());

        //4:线程池
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                3,//核心线程数
                10,//最大线程数
                3,//最大空闲时间,
                TimeUnit.SECONDS,//单位
                new ArrayBlockingQueue<Runnable>(10),//线程池中的有序阻塞队列
                Executors.defaultThreadFactory(),//线程池自带工厂
                new ThreadPoolExecutor.AbortPolicy()  //默认的拒绝策略
        );
        threadPoolExecutor.execute(() -> {//Lambda   java1.8新特性
            System.out.println("当前线程的名称:" + Thread.currentThread().getName());
        });

    }
}
class MyCallable implements Callable<String>{

    /**
     * 此线程是有返回值的
     * @return
     * @throws Exception
     */
    public String call() throws Exception {
        System.out.println("当前线程的名称:" + Thread.currentThread().getName());
        return "我是Callable的多线程";
    }
}
class MyRunnable implements Runnable{


    public void run() {
        System.out.println("当前线程的名称:" + Thread.currentThread().getName());
    }
}
class MyThread  extends Thread{

    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        System.out.println("当前线程的名称:" + Thread.currentThread().getName());
    }
}
